import axios from 'axios'

const baseOptions = {
  baseURL: 'http://123.207.32.32:8000/api/h8',
  timeout: 5000
}

// 1.
// config:  用户传入的请求参数对象
// success: 成功回调函数
// failure: 失败回调函数
export function request1(config, success, failure) {
  // 1. 创建一个axios的实例
  const instance = axios.create(baseOptions);

  // 发送网络请求
  instance(config)
    .then(res => {
      // console.log("[正常] >>>", res);
      success(res.data);
    })
    .catch(err => {
      // console.log("[异常] >>>", err);
      failure(err);
    })
}

// 2. 需要使用者给我传一个对象config中包含一个配置对象和两个回调函数
// baseConfig: 配置对象
// success: 成功回调
// failure: 失败回调
export function request2(config) {
  const instance = axios.create(baseOptions);

  // 发送网络请求
  instance(config.baseConfig)
    .then(res => {
      // console.log("[正常] >>>", res);
      config.success(res.data);
    })
    .catch(err => {
      // console.log("[异常] >>>", err);
      config.failure(err);
    })
}

// 3. 直接axios创建的实例返回, 因为实例本身返回的就是一个Promise, 直接让外部使用.then或.catch接收处理即可。
export function request3(config) {
  const instance = axios.create(baseOptions);

  // 3.1 axios拦截器
  // 3.1.1 请求拦截
  instance.interceptors.request.use(
    config => {
      // 成功
      console.log("[请求拦截] 请求配置内容 >>>", config);

      // [拦截后需要处理的代码] >>> ...
      // 1) 可能需要处理config中不符合服务器要求的信息;
      // 2) 每次发送网络请求时, 希望在界面显示一个请求的图标;
      // 3）某些网络请求[例如登录token], 需要在请求时携带。

      // 处理完后记得把config给别人返回, 不然会请求异常
      return config;
    },
    err => {
      // 请求失败...
    }
  )

  // 3.1.2 响应拦截
  instance.interceptors.response.use(
    res => {
      // 响应成功后的结果
      console.log('[响应拦截] 结果 >>>', res.data);

      // 结果给then(res => {})的res返回, 否则接收不到响应成功的消息
      return res.data;
    },
    err => {
      // 响应失败...
    }
  )

  // 3.2 发送网络请求 并 返回！！！
  return instance(config);
}